package beans;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

import modelo.PerfilEnum;
import modelo.PerfilEnum.TipoPerfil;
import modelo.Perfil;
import modelo.Usuario;
import modelo.Persona;
import dao.PerfilDao;
import dao.PersonaDao;
import dao.UsuarioDao;
import excepciones.DaoException;

@ManagedBean //(name = "LoginBean")
@RequestScoped
public class EditUsuarioPersonaBean {
	
	@ManagedProperty(value="#{loginBean}")
	private LoginBean loginBean;
	
	@ManagedProperty(value="#{listUsuariosBean}")
	private ListUsuariosBean listUsuariosBean;
	
	private Usuario objUsuario;
	private List<Persona> personas;
	private Persona selected;
	private List<String> perfiles;
	private List<String> selectedPerfil;
	private UsuarioDao usuarioDao;
	private String usuario;
	private String password;
		
	@PostConstruct
	public void init(){
		/* Recupero las personas */
		PersonaDao perDao = new PersonaDao();
		try {
			this.setPersonas(perDao.getTodasLasPersonas());
		} catch (DaoException e1) {
			e1.printStackTrace();
		}
		PerfilEnum perf = new PerfilEnum(TipoPerfil.ADMINISTRADOR);
		setPerfiles(perf.getAllPerfiles());
		/* Recupero el usuario y le asigno la persona seleccionada si corresponde */
		this.objUsuario = new Usuario();
		usuarioDao = new UsuarioDao();
		if (listUsuariosBean.getSelected() != null){
			
			try {
				this.objUsuario = (Usuario) usuarioDao.findById(listUsuariosBean.getSelected());
				this.usuario = objUsuario.getUsuario();
				this.password = objUsuario.getPassword();
			} catch (DaoException e) {
				e.printStackTrace();
			}
			this.setSelected(objUsuario.getUnaPersona());
			// TODO: ACA ASIGNO EL PERFIL DEL USUARIO 
			this.setSelectedPerfil(objUsuario.getPerfilesString());
			
		}else{
			this.setSelected(null);
			this.setSelectedPerfil(null);
		}
		
	}
	
	public String saveUsuario(){

		//UsuarioDao usrDao = new UsuarioDao(objUsuario);
		Set<Perfil> perfilesUsuario = new HashSet<Perfil>();
		for (String perf : getSelectedPerfil()) {
			
			PerfilDao perfDao = new PerfilDao();
    		Perfil perfil;
			try {
				perfil = perfDao.encontrarPorNombre(perf);
				perfilesUsuario.add(perfil);
		   		perfDao.closeEntityManager();
	    		
			} catch (DaoException e) {
				e.printStackTrace();
			}
    		
		}
		objUsuario.setPerfiles(perfilesUsuario);
		if (password.length()!=0)
			objUsuario.setPassword(password);
		objUsuario.setUsuario(usuario);
		try {
			usuarioDao.update();
			usuarioDao.closeEntityManager();			
		} catch (DaoException e) {
			e.printStackTrace();
		}
		
		return "irListadoUsuarios";
	}
	
	public String volver(){
		return "irListadoUsuarios";
	}

	public LoginBean getLoginBean() {
		return loginBean;
	}
	
	public void setLoginBean(LoginBean loginBean) {
		this.loginBean = loginBean;
	}

	public Usuario getObjUsuario() {
		return objUsuario;
	}

	public void setObjUsuario(Usuario objUsuario) {
		this.objUsuario = objUsuario;
	}

	public ListUsuariosBean getListUsuariosBean() {
		return listUsuariosBean;
	}

	public void setListUsuariosBean(ListUsuariosBean listUsuariosBean) {
		this.listUsuariosBean = listUsuariosBean;
	}

	public List<Persona> getPersonas() {
		return personas;
	}

	public void setPersonas(List<Persona> personas) {
		this.personas = personas;
	}

	public Persona getSelected() {
		return selected;
	}

	public void setSelected(Persona selected) {
		this.selected = selected;
	}

	public List<String> getSelectedPerfil() {
		return selectedPerfil;
	}

	public void setSelectedPerfil(List<String> selectedPerfil) {
		this.selectedPerfil = selectedPerfil;
	}

	public List<String> getPerfiles() {
		return perfiles;
	}

	public void setPerfiles(List<String> perfiles) {
		this.perfiles = perfiles;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}	
	
}